home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
User's Choice Windows CD
/
User's Choice Windows CD (CMS Software)(1993).iso
/
misc1
/
instal.zip
/
WSLIB
/
DOS.ASM
< prev
next >
Wrap
Assembly Source File
|
1990-07-04
|
13KB
|
391 lines
;****************************************************************************
;* *
;* WFDOSDIR.ASM - *
;* *
;* Directory searching primitives *
;* *
;****************************************************************************
?PLM=1 ; PASCAL Calling convention is DEFAULT
?WIN=1 ; Windows calling convention
?386=0 ; Use 386 code?
include cmacros.inc
; The following structure should be used to access high and low
; words of a DWORD. This means that "word ptr foo[2]" -> "foo.hi".
LONG struc
lo dw ?
hi dw ?
LONG ends
FARPOINTER struc
off dw ?
sel dw ?
FARPOINTER ends
ifndef SEGNAME
SEGNAME equ <TEXT>
endif
if ?386
createSeg _%SEGNAME, CodeSeg, word, use16, CODE
else
createSeg _%SEGNAME, CodeSeg, word, public, CODE
endif
NOT_SUPPORTED = 2h ; Return code from IsDeviceRemote function.
REMOTE = 3h ; Return code for remote drive found.
TRUE = 1h ; TRUE Definition
FALSE = 0h ; False Definition.
;=============================================================================
sBegin DATA
VolExtendedFCB db 0FFh
db 0, 0, 0, 0, 0
db 1000b
db 0
db 11 dup('?')
db 5 dup(0)
db 11 dup('?')
db 9 dup(0)
DTA db 64 dup(0)
sEnd DATA
;=============================================================================
sBegin CodeSeg
assumes CS,CodeSeg
assumes DS,DATA
;*--------------------------------------------------------------------------*
;* *
;* DosFindFirst() - *
;* *
;*--------------------------------------------------------------------------*
; Get the first directory entry.
cProc DosFindFirst, <FAR, PUBLIC>
ParmD lpDest
ParmD szFileSpec
ParmW attrib
cBegin
push ds
lds dx,lpDest
mov ah,1Ah ; Set DTA
int 21h
mov cx,attrib ; Find First File
lds dx,szFileSpec ; Path = szFileSpec
mov ah,4Eh
int 21h
jc fferr
mov ax,1
jmp short ffdone
fferr:
xor ax,ax ; Return zero on error
ffdone:
pop ds
cEnd
;*--------------------------------------------------------------------------*
;* *
;* DosFindNext() - *
;* *
;*--------------------------------------------------------------------------*
cProc DosFindNext, <FAR, PUBLIC>
ParmD lpDest
cBegin
push ds
lds dx,lpDest
mov ah,1Ah ; Set DTA
int 21h
pop ds
les bx,lpDest ; ES:BX = lpDest
mov ah,4Fh ; Find Next File
int 21h
mov ax,1
jnc FNExit ; Exit if no error
FNErr:
xor ax,ax ; Return FALSE
FNExit:
cEnd
;*--------------------------------------------------------------------------*
;* *
;* DosMkDir() *
;* *
;*--------------------------------------------------------------------------*
cProc DosMkDir, <FAR, PUBLIC>
ParmD szDir
cBegin
lds dx,szDir
mov ah,39h
int 21h
jc mderror
xor ax,ax
jmp short mdexit
mderror:
mov ah,59h
xor bx,bx
int 21h
mdexit:
cEnd
;*--------------------------------------------------------------------------*
;* *
;* MyReadWriteSector() - *
;* *
;*--------------------------------------------------------------------------*
; Uses INT 13h to read/write an absolute sector.
cProc MyReadWriteSector, <PUBLIC, FAR>, <SI,DI>
ParmD lpBuffer
ParmW Function ; 02 for Read and 03 for Write
ParmW Drive
ParmW Cylinder
ParmW Head
ParmW Count
LocalW wRetryCount
cBegin
; Retry this operation three times.
mov wRetryCount,4
MRWS_TryAgain:
mov ax,Count ; AL = Number of sectors
mov ah,byte ptr Function ; AH = Function #
mov ch,byte ptr Cylinder ; CH = Starting Cylinder
mov cl,1 ; CL = Starting Sector
mov dx,Drive ; DL = INT 13h drive designation
mov dh,byte ptr Head ; DH = Head #
les bx,lpBuffer ; ES:BX = Buffer
int 13h
mov ax, 1 ; success
jnc MRWS_End_success ; Problems?
dec wRetryCount ; Yup, retry
jz MRWS_End_fail ; Are we out of retries?
xor ah,ah ; Nope, reset the disk
mov dx,Drive
int 13h
jmp short MRWS_TryAgain
MRWS_End_fail:
xor al,al ; AH contains the error code, if any.
MRWS_End_success:
cEnd
;*--------------------------------------------------------------------------*
;* *
;* GetCurrentDrive() - *
;* *
;*--------------------------------------------------------------------------*
cProc GetCurrentDrive, <FAR, PUBLIC>
cBegin
mov ah,19h ; Get Current Drive
int 21h
sub ah,ah ; Zero out AH
cEnd
;*--------------------------------------------------------------------------*
;* *
;* GetCurrentDirectory() - *
;* *
;*--------------------------------------------------------------------------*
cProc DosCwd, <FAR, PUBLIC>, <SI, DI>
ParmD lpDest
cBegin
push ds ; Preserve DS
call GetCurrentDrive
mov si,ax ; SI = Current drive
les di,lpDest ; ES:DI = lpDest
push es
pop ds ; DS:DI = lpDest
cld
mov ax,si ; AX = Current drive
inc al ; Convert to logical drive number
mov dl,al ; DL = Logical Drive Number
add al,'@' ; Convert to ASCII drive letter
stosb
mov al,':'
stosb
mov al,'\' ; Start string with a backslash
stosb
mov byte ptr es:[di],0 ; Null terminate in case of error
mov si,di ; DS:SI = lpDest[1]
mov ah,47h ; Get Current Directory
int 21h
jc CDExit ; Skip if error
xor ax,ax ; Return FALSE if no error
CDExit:
pop ds ; Restore DS
cEnd
;*--------------------------------------------------------------------------*
;* *
;* SetCurrentDrive() - *
;* *
;*--------------------------------------------------------------------------*
; Returns the number of drives in AX.
cProc SetCurrentDrive, <FAR, PUBLIC>
ParmW Drive
cBegin
mov dx,Drive
mov ah,0Eh ; Set Current Drive
int 21h
sub ah,ah ; Zero out AH
cEnd
;*--------------------------------------------------------------------------*
;* *
;* SetCurrentDirectory() - *
;* *
;*--------------------------------------------------------------------------*
cProc DosChDir, <FAR, PUBLIC>
ParmD lpDirName
cBegin
push ds ; Preserve DS
lds dx,lpDirName ; DS:DX = lpDirName
mov bx,dx
mov ax,ds:[bx]
cmp ah,':'
jnz cdnodrive
;
; Convert drive letter to drive index
;
or al,20h
sub al,'a'
xor ah,ah
push dx
cCall SetCurrentDrive,<ax>
pop dx
cdnodrive:
mov ah,3Bh ; Change Current Directory
int 21h
jc SCDExit ; Skip on error
xor ax,ax ; Return FALSE if successful
SCDExit:
pop ds ; Restore DS
cEnd
;*--------------------------------------------------------------------------*
;* *
;* DosValidDir() *
;* *
;*--------------------------------------------------------------------------*
cProc DosValidDir, <FAR, PUBLIC>, <SI, DI>
ParmD szDir
LocalV szCwd, 128
cBegin
lea si,szCwd
cCall DosCwd,<ss,si>
push szDir.sel
push szDir.off
call DosChDir
or ax,ax
pushf
cCall DosChDir,<ss,si>
;
; return TRUE if DosChdir returns 0, FALSE otherwise
;
xor ax,ax ; don't care about this return val.
popf
jnz vdexit
inc ax
vdexit:
cEnd
;*--------------------------------------------------------------------------
;*
;* LONG DosDiskFreeSpace(Drive)
;*
;* note:
;* Drive == 0 default
;* Drive == 1 A
;* Drive == 2 B
;*--------------------------------------------------------------------------
; Returns the number of bytes free in DX:AX
cProc DosDiskFreeSpace, <FAR, PUBLIC>
ParmW Drive
cBegin
mov dx,Drive
mov ah,36h ; Set Current Drive
int 21h
cmp ax, 0ffffh ; bogus drive?
je error
mul cx ;
mul bx
jmp done ; DX:AX contains free space
error:
mov dx, ax ; return dx:ax = -1L
done:
cEnd
;*--------------------------------------------------------------------------*
;* *
;* DosExit(ec); *
;* *
;* Terminate program *
;* *
;*--------------------------------------------------------------------------*
cProc DosExit, <FAR, PUBLIC>
ParmW ec
cBegin
mov al,byte ptr ec
mov ah,4Ch
int 21h
cEnd
sEnd CodeSeg
end